Reactμ experimental_SuspenseListλ‘ κ³ κΈ λ‘λ© μ λ΅μ νμ©νμΈμ. μ΄ ν¬κ΄μ μΈ κ°μ΄λλ ν₯μλ μ¬μ©μ κ²½νμ μν΄ μμ°¨μ λ μ΄μμκ³Ό λλ¬λλ λ μ΄μμμ νꡬν©λλ€.
React experimental_SuspenseList: Suspense λ‘λ© ν¨ν΄ λ§μ€ν°νκΈ°
Reactμ experimental_SuspenseListλ μ¬λ¬ Suspense μ»΄ν¬λνΈμ νμλ₯Ό μ‘°μ νμ¬ λ‘λ© μνλ₯Ό μΈλ°νκ² μ μ΄νκ³ κΆκ·Ήμ μΌλ‘ μ ν리μΌμ΄μ
μ μΈμ§λ μ±λ₯κ³Ό μ¬μ©μ κ²½νμ ν₯μμν¬ μ μλ κ°λ ₯ν(νμ§λ§ μ¬μ ν μ€νμ μΈ) μ»΄ν¬λνΈμ
λλ€. μ΄ κ°μ΄λμμλ experimental_SuspenseListμ ν΅μ¬ κ°λ
, κΈ°λ₯ λ° μ€μ μ μ© μ¬λ‘λ₯Ό μ΄ν΄λ³΄κ³ React μ ν리μΌμ΄μ
μμ μ κ΅ν λ‘λ© ν¨ν΄μ ꡬνν μ μλλ‘ ν©λλ€.
Suspense λ° κ·Έ νκ³ μ΄ν΄
experimental_SuspenseListμ λ€μ΄κ°κΈ° μ μ React Suspenseμ κΈ°λ³Έ μ¬νμ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€. Suspenseλ₯Ό μ¬μ©νλ©΄ νΉμ 쑰건(μΌλ°μ μΌλ‘ λ°μ΄ν° λ‘λ©)μ΄ μΆ©μ‘±λ λκΉμ§ μ»΄ν¬λνΈμ λ λλ§μ "μΌμ μ€λ¨"ν μ μμ΅λλ€. Suspense κ²½κ³μμ μΌμ μ€λ¨λ μ μλ μ»΄ν¬λνΈλ₯Ό λννκ³ λκΈ°νλ λμ λ λλ§ν λ΄μ©μ μ§μ νλ fallback propμ μ 곡ν©λλ€. μλ₯Ό λ€μ΄:
import React, { Suspense } from 'react';
const ProfileDetails = React.lazy(() => import('./ProfileDetails'));
const ProfilePosts = React.lazy(() => import('./ProfilePosts'));
function ProfilePage() {
return (
<Suspense fallback={<p>νλ‘ν λ‘λ© μ€...</p>}>
<ProfileDetails />
<Suspense fallback={<p>κ²μλ¬Ό λ‘λ© μ€...</p>}>
<ProfilePosts />
</Suspense>
</Suspense>
);
}
Suspenseλ κΈ°λ³Έμ μΈ λ‘λ© νμκΈ°λ₯Ό μ 곡νμ§λ§ λ‘λ© νμκΈ°κ° λνλλ μμλ₯Ό μ μ΄νμ§ λͺ»νλ―λ‘ λλ‘λ λΆνΈν μ¬μ©μ κ²½νμ μ΄λν μ μμ΅λλ€. ProfileDetails λ° ProfilePosts μ»΄ν¬λνΈκ° λ
립μ μΌλ‘ λ‘λ©λκ³ λ‘λ© νμκΈ°κ° μλ‘ λ€λ₯Έ μκ°μ κΉλ°μ΄λ κ²μ μμν΄ λ³΄μΈμ. λ°λ‘ μ΄λ΄ λ experimental_SuspenseListκ° νμν©λλ€.
experimental_SuspenseList μκ°
experimental_SuspenseListλ₯Ό μ¬μ©νλ©΄ Suspense κ²½κ³κ° νμλλ μμλ₯Ό μ‘°μ ν μ μμ΅λλ€. revealOrder propμ μν΄ μ μ΄λλ λ κ°μ§ μ£Όμ λμμ μ 곡ν©λλ€.
forwards: μ»΄ν¬λνΈ νΈλ¦¬μ λνλλ μμλλ‘Suspenseκ²½κ³λ₯Ό νμν©λλ€.backwards: μμμΌλ‘Suspenseκ²½κ³λ₯Ό νμν©λλ€.together: λͺ¨λSuspenseκ²½κ³λ₯Ό λμμ νμν©λλ€.
experimental_SuspenseListλ₯Ό μ¬μ©νλ €λ©΄ μ€νμ κΈ°λ₯μ μ§μνλ React λ²μ μ μ¬μ©ν΄μΌ ν©λλ€. μ€νμ κΈ°λ₯ νμ±ν λ° κ΄λ ¨ κ²½κ³ μ λν μ΅μ μ 보λ React μ€λͺ
μλ₯Ό μ°Έμ‘°νλ κ²μ΄ μ€μν©λλ€. React ν¨ν€μ§μμ μ§μ κ°μ ΈμμΌ ν©λλ€.
import { unstable_SuspenseList as SuspenseList } from 'react';
μ°Έκ³ : μ΄λ¦μμ μ μ μλ―μ΄ experimental_SuspenseListλ μ€νμ μΈ κΈ°λ₯μ΄λ©° λ³κ²½λ μ μμ΅λλ€. νλ‘λμ
νκ²½μμλ μ£Όμν΄μ μ¬μ©νμΈμ.
`revealOrder="forwards"`λ₯Ό μ¬μ©ν μμ°¨μ λ‘λ© κ΅¬ν
forwards νμ μμλ μλ§λ experimental_SuspenseListμ λν κ°μ₯ μΌλ°μ μΈ μ¬μ© μ¬λ‘μΌ κ²μ
λλ€. μμΈ‘ κ°λ₯νκ³ μμ°¨μ μΈ λ°©μμΌλ‘ λ‘λ© νμκΈ°λ₯Ό νμνμ¬ λ λΆλλ¬μ΄ μ¬μ©μ κ²½νμ λ§λ€ μ μμ΅λλ€. λ€μ μμ λ₯Ό κ³ λ €ν΄ λ³΄μΈμ.
import React, { Suspense, lazy } from 'react';
import { unstable_SuspenseList as SuspenseList } from 'react';
const ProfileHeader = lazy(() => import('./ProfileHeader'));
const ProfileDetails = lazy(() => import('./ProfileDetails'));
const ProfilePosts = lazy(() => import('./ProfilePosts'));
function ProfilePage() {
return (
<SuspenseList revealOrder="forwards">
<Suspense fallback={<p>ν€λ λ‘λ© μ€...</p>}>
<ProfileHeader />
</Suspense>
<Suspense fallback={<p>μΈλΆ μ 보 λ‘λ© μ€...</p>}>
<ProfileDetails />
</Suspense>
<Suspense fallback={<p>κ²μλ¬Ό λ‘λ© μ€...</p>}>
<ProfilePosts />
</Suspense>
</SuspenseList>
);
}
μ΄ μμ μμ λ‘λ© νμκΈ°λ λ€μ μμλ‘ λνλ©λλ€.
- "ν€λ λ‘λ© μ€..."
- "μΈλΆ μ 보 λ‘λ© μ€..." (ProfileHeaderκ° λ‘λλ ν λνλ¨)
- "κ²μλ¬Ό λ‘λ© μ€..." (ProfileDetailsκ° λ‘λλ ν λνλ¨)
μ΄λ κ² νλ©΄ λ‘λ© νμκΈ°κ° λ¬΄μμλ‘ λνλ μ μλ Suspenseμ κΈ°λ³Έ λμμ λΉν΄ λ 체κ³μ μ΄κ³ λ λΆνΈν λ‘λ© κ²½νμ΄ λ§λ€μ΄μ§λλ€.
`revealOrder="backwards"`λ₯Ό μ¬μ©ν μμμ°¨μ λ‘λ©
backwards νμ μμλ νμ΄μ§ νλ¨μ μμλ₯Ό λ¨Όμ λ‘λνλ λ° μ μ©ν©λλ€. κ°μ₯ μ€μν μ½ν
μΈ κ° νμ΄μ§ μλμͺ½μ μλλΌλ λΉ λ₯΄κ² νμνλ €λ κ²½μ°μ λ°λμ§ν μ μμ΅λλ€. μμ μμ μ λμΌν μμ λ₯Ό μ¬μ©νμ¬ revealOrderλ₯Ό `backwards`λ‘ λ³κ²½ν©λλ€.
<SuspenseList revealOrder="backwards">
<Suspense fallback={<p>ν€λ λ‘λ© μ€...</p>}>
<ProfileHeader />
</Suspense>
<Suspense fallback={<p>μΈλΆ μ 보 λ‘λ© μ€...</p>}>
<ProfileDetails />
</Suspense>
<Suspense fallback={<p>κ²μλ¬Ό λ‘λ© μ€...</p>}>
<ProfilePosts />
</Suspense>
</SuspenseList>
μ΄μ λ‘λ© νμκΈ°κ° λ€μ μμλ‘ λνλ©λλ€.
- "κ²μλ¬Ό λ‘λ© μ€..."
- "μΈλΆ μ 보 λ‘λ© μ€..." (ProfilePostsκ° λ‘λλ ν λνλ¨)
- "ν€λ λ‘λ© μ€..." (ProfileDetailsκ° λ‘λλ ν λνλ¨)
μ¬μ©μκ° μΌλ°μ μΌλ‘ κ°μ₯ μ΅κ·Ό κ²μλ¬Όμ 보기 μν΄ μλλ‘ μ€ν¬λ‘€νλ κ²½μ° κ²μλ¬Ό μΉμ μ λ‘λ©μ μ°μ μνμ¬ μ ν리μΌμ΄μ μ΄ μ΅μνμ κΈ°λ₯μ μΈ κ²½νμ λ λΉ λ₯΄κ² μ 곡ν μ μμ΅λλ€.
`revealOrder="together"`λ₯Ό μ¬μ©ν λμ λ‘λ©
together νμ μμλ λ¨μν λͺ¨λ λ‘λ© νμκΈ°λ₯Ό λμμ νμν©λλ€. μ΄λ μ§κ΄μ μ΄κΈλλ κ²μ²λΌ λ³΄μΌ μ μμ§λ§ νΉμ μλ리μ€μμ μ μ©ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ λͺ¨λ μ»΄ν¬λνΈμ λ‘λ© μκ°μ΄ λΉκ΅μ μ§§μ κ²½μ° λͺ¨λ λ‘λ© νμκΈ°λ₯Ό ν λ²μ νμνλ©΄ μ 체 νμ΄μ§κ° λ‘λ© μ€μ΄λΌλ μκ°μ μ νΈλ₯Ό μ 곡ν μ μμ΅λλ€.
<SuspenseList revealOrder="together">
<Suspense fallback={<p>ν€λ λ‘λ© μ€...</p>}>
<ProfileHeader />
</Suspense>
<Suspense fallback={<p>μΈλΆ μ 보 λ‘λ© μ€...</p>}>
<ProfileDetails />
</Suspense>
<Suspense fallback={<p>κ²μλ¬Ό λ‘λ© μ€...</p>}>
<ProfilePosts />
</Suspense>
</SuspenseList>
μ΄ κ²½μ° μΈ κ°μ λ‘λ© λ©μμ§("ν€λ λ‘λ© μ€...", "μΈλΆ μ 보 λ‘λ© μ€...", "κ²μλ¬Ό λ‘λ© μ€...")κ° λͺ¨λ λμμ λνλ©λλ€.
`tail`μ μ¬μ©ν νμ μ λλ©μ΄μ μ μ΄
experimental_SuspenseListλ νμ νλͺ©μ΄ μ¬μ ν λ‘λ© μ€μΈ λμ μ΄λ―Έ νμλ νλͺ©μ΄ μλνλ λ°©μμ μ μ΄νλ tailμ΄λΌλ λ λ€λ₯Έ propμ μ 곡ν©λλ€. λ κ°μ§ κ°μ νμ©ν©λλ€.
suspense: μ΄λ―Έ νμλ νλͺ©λ ν΄λ°±μ΄ μλSuspenseκ²½κ³λ‘ λνλ©λλ€. μ΄λ κ² νλ©΄ λͺ©λ‘μ λͺ¨λ νλͺ©μ΄ λ‘λλ λκΉμ§ λ€μ μ¨κ²¨μ§λλ€.collapsed: μ΄λ―Έ νμλ νλͺ©μ νμ νλͺ©μ΄ λ‘λλλ λμ κ³μ νμλ©λλ€. μ΄κ²μ΄tailpropμ΄ μ§μ λμ§ μμ κ²½μ°μ κΈ°λ³Έ λμμ λλ€.
tail="suspense" μ΅μ
μ νΉν λ€λ₯Έ μ»΄ν¬λνΈμ λ‘λ© μκ°μ΄ ν¬κ² λ€λ₯Έ κ²½μ° μκ°μ μΌλ‘ λ μΌκ΄λ λ‘λ© κ²½νμ λ§λλ λ° μ μ©ν μ μμ΅λλ€. ProfileHeaderκ° λΉ λ₯΄κ² λ‘λλμ§λ§ ProfilePostsκ° μ€λ 걸리λ μλ리μ€λ₯Ό μμν΄ λ³΄μΈμ. tail="suspense" μ΅μ
μ΄ μμΌλ©΄ μ¬μ©μλ ν€λκ° μ¦μ λνλκ³ κ²μλ¬Όμ΄ λ‘λλκΈ° μ μ κΈ΄ μΌμ μ€μ§κ° λ°μνλ κ²μ λ³Ό μ μμ΅λλ€. μ΄κ²μ μ°κ²°μ΄ λμ΄μ§ κ²μ²λΌ λκ»΄μ§ μ μμ΅λλ€.
tail="suspense"λ₯Ό μ¬μ©νλ©΄ κ²μλ¬Όμ΄ λ‘λλ λκΉμ§ ν€λκ° μ¨κ²¨μ§κ±°λ ν΄λ°±μ΄ νμλμ΄ λ μνν μ νμ΄ μ΄λ£¨μ΄μ§λλ€.
<SuspenseList revealOrder="forwards" tail="suspense">
<Suspense fallback={<p>ν€λ λ‘λ© μ€...</p>}>
<ProfileHeader />
</Suspense>
<Suspense fallback={<p>μΈλΆ μ 보 λ‘λ© μ€...</p>}>
<ProfileDetails />
</Suspense>
<Suspense fallback={<p>κ²μλ¬Ό λ‘λ© μ€...</p>}>
<ProfilePosts />
</Suspense>
</SuspenseList>
SuspenseList μ€μ²©
experimental_SuspenseList μ»΄ν¬λνΈλ₯Ό μ€μ²©νμ¬ λμ± λ³΅μ‘ν λ‘λ© ν¨ν΄μ λ§λ€ μ μμ΅λλ€. μ΄λ κ² νλ©΄ κ΄λ ¨ μ»΄ν¬λνΈλ₯Ό κ·Έλ£Ήννκ³ λ‘λ© λμμ λ
립μ μΌλ‘ μ μ΄ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ νμ΄μ§μ μ 체 λ μ΄μμμ μ μ΄νλ κΈ°λ³Έ SuspenseListμ κ° μΉμ
λ΄μμ κ°λ³ μμμ λ‘λ©μ μ μ΄νλ μ€μ²©λ SuspenseList μ»΄ν¬λνΈλ₯Ό κ°μ§ μ μμ΅λλ€.
import React, { Suspense, lazy } from 'react';
import { unstable_SuspenseList as SuspenseList } from 'react';
const ProfileHeader = lazy(() => import('./ProfileHeader'));
const ProfileDetails = lazy(() => import('./ProfileDetails'));
const ProfilePosts = lazy(() => import('./ProfilePosts'));
const AdBanner = lazy(() => import('./AdBanner'));
const RelatedArticles = lazy(() => import('./RelatedArticles'));
function ProfilePage() {
return (
<SuspenseList revealOrder="forwards">
<Suspense fallback={<p>ν€λ λ‘λ© μ€...</p>}>
<ProfileHeader />
</Suspense>
<div>
<SuspenseList revealOrder="forwards">
<Suspense fallback={<p>μΈλΆ μ 보 λ‘λ© μ€...</p>}>
<ProfileDetails />
</Suspense>
<Suspense fallback={<p>κ²μλ¬Ό λ‘λ© μ€...</p>}>
<ProfilePosts />
</Suspense>
</SuspenseList>
</div>
<Suspense fallback={<p>κ΄κ³ λ‘λ© μ€...</p>}>
<AdBanner />
</Suspense>
<Suspense fallback={<p>κ΄λ ¨ κΈ°μ¬ λ‘λ© μ€...</p>}>
<RelatedArticles />
</Suspense>
</SuspenseList>
);
}
μ΄ μμ μμλ ProfileHeaderκ° λ¨Όμ λ‘λλκ³ ProfileDetails λ° ProfilePosts, λ§μ§λ§μΌλ‘ AdBanner λ° RelatedArticlesκ° λ‘λλ©λλ€. λ΄λΆ SuspenseListλ ProfileDetailsκ° ProfilePostsλ³΄λ€ λ¨Όμ λ‘λλλλ‘ ν©λλ€. μ΄λ¬ν μμ€μ λ‘λ© μμ μ μ΄λ μ ν리μΌμ΄μ
μ μΈμ§λ μ±λ₯κ³Ό μλ΅μ±μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
μ€μ μμ λ° κ΅μ μ κ³ λ € μ¬ν
experimental_SuspenseListμ μ΄μ μ λ€μν μ ν리μΌμ΄μ
μ νκ³Ό κ΅μ μ¬μ©μ κΈ°λ°μ κ±Έμ³ νμ₯λ©λλ€. λ€μ μλ리μ€λ₯Ό κ³ λ €ν΄ λ³΄μΈμ.
- μ μ μκ±°λ νλ«νΌ: κΈλ‘λ² μ μ μκ±°λ μ¬μ΄νΈλ
experimental_SuspenseListλ₯Ό μ¬μ©νμ¬ λ¦¬λ·°λ³΄λ€ λ¨Όμ μ ν μ΄λ―Έμ§μ μ€λͺ μ λ‘λνμ¬ μ¬μ©μκ° μ¬μ© κ°λ₯ν μ νμ λΉ λ₯΄κ² μ°Ύμλ³Ό μ μλλ‘ ν μ μμ΅λλ€. `revealOrder="forwards"`λ₯Ό μ¬μ©νλ©΄ μ μΈκ³ μ¬μ©μκ° κ΅¬λ§€ κ²°μ μ λ΄λ¦¬λ λ° μ€μν μ£Όμ μ ν μΈλΆ μ λ³΄κ° λ¨Όμ λ‘λλλλ‘ ν μ μμ΅λλ€. - λ΄μ€ μΉμ¬μ΄νΈ: μ¬λ¬ κ΅κ°μ λ
μμκ² μλΉμ€λ₯Ό μ 곡νλ λ΄μ€ μΉμ¬μ΄νΈλ
experimental_SuspenseListλ₯Ό μ¬μ©νμ¬ λ μ€μν μ½ν μΈ λ³΄λ€ λ¨Όμ μ보 ν€λλΌμΈμ λ‘λνμ¬ μ¬μ©μκ° μ€μν μ΄λ²€νΈλ₯Ό μ¦μ μ μ μλλ‘ ν μ μμ΅λλ€. μ§μλ³ λ΄μ€μ λ°λΌ λ‘λ© μμλ₯Ό μ‘°μ ν μλ μμ΅λλ€. - μμ
λ―Έλμ΄ μ ν리μΌμ΄μ
: μμ
λ―Έλμ΄ νλ«νΌμ
experimental_SuspenseListλ₯Ό μ¬μ©νμ¬ νλ‘ν μ¬μ§κ³Ό μ¬μ©μ μ΄λ¦μΌλ‘ μμνμ¬ μ¬μ©μ μΈλΆ μ 보μ μ΅κ·Ό κ²μλ¬Όλ‘ μ΄μ΄μ§λ μμ°¨μ μΌλ‘ μ¬μ©μ νλ‘νμ λ‘λν μ μμ΅λλ€. μ΄λ κ² νλ©΄ νΉν μΈν°λ· μλκ° λ€μν μ§μμμ μ΄κΈ° μΈμ§λ μ±λ₯κ³Ό μ¬μ©μ μ°Έμ¬λκ° ν₯μλ©λλ€. - λμ보λ λ° λΆμ: λ€μν μμ€(μ: Google Analytics, Salesforce, λ΄λΆ λ°μ΄ν°λ² μ΄μ€)μ λ°μ΄ν°λ₯Ό νμνλ λμ보λμ κ²½μ°
experimental_SuspenseListλ λ€μν λ°μ΄ν° μκ°νμ λ‘λ©μ μ€μΌμ€νΈλ μ΄μ ν μ μμ΅λλ€. μ΄λ κ² νλ©΄ νΉν μΌλΆ λ°μ΄ν° μμ€κ° λ€λ₯Έ λ°μ΄ν° μμ€λ³΄λ€ λ릴 λ μνν λ‘λ© κ²½νμ΄ λ³΄μ₯λ©λλ€. μμΈν μ°¨νΈμ κ·Έλνλ³΄λ€ λ¨Όμ ν΅μ¬ μ±κ³Ό μ§ν(KPI)λ₯Ό νμν μ μμ΅λλ€.
κΈλ‘λ² λμμ μν΄ κ°λ°ν λλ experimental_SuspenseListλ₯Ό ꡬνν λ λ€μ κ΅μ ν(i18n) μμλ₯Ό κ³ λ €νμμμ€.
- λ€νΈμν¬ λκΈ° μκ°: λ€λ₯Έ μ§λ¦¬μ μμΉμ μ¬μ©μλ λ€μν λ€νΈμν¬ λκΈ° μκ°μ κ²½νν μ μμ΅λλ€.
experimental_SuspenseListλ₯Ό μ¬μ©νμ¬ μ¬μ©μμκ² κ°μ₯ μ€μν μ½ν μΈ μ λ‘λ©μ μ°μ μνμ¬ λ€νΈμν¬ μ‘°κ±΄μ κ΄κ³μμ΄ ν©λ¦¬μ μΈ μ΄κΈ° κ²½νμ 보μ₯ν©λλ€. - μ₯μΉ κΈ°λ₯: λ€λ₯Έ κ΅κ°μ μ¬μ©μλ λ€μν μ²λ¦¬ λ₯λ ₯κ³Ό νλ©΄ ν¬κΈ°λ₯Ό κ°μ§ λ€λ₯Έ μ₯μΉλ₯Ό μ¬μ©νμ¬ μ ν리μΌμ΄μ μ μ‘μΈμ€ν μ μμ΅λλ€. μ¬μ© μ€μΈ μ₯μΉμ κ°μ₯ κ΄λ ¨μ±μ΄ λμ μ½ν μΈ μ μ°μ μμλ₯Ό μ§μ νλλ‘ λ‘λ© μμλ₯Ό μ΅μ νν©λλ€.
- μΈμ΄ λ° νμ§ν: λ‘λ© νμκΈ° λ° ν΄λ°± μ½ν μΈ κ° λ€λ₯Έ μΈμ΄ λ° μ§μμ λ§κ² μ¬λ°λ₯΄κ² λ²μλκ³ νμ§νλμλμ§ νμΈν©λλ€. μλμ΄ λλ νλΈλ¦¬μ΄μ κ°μ μΈμ΄μ κ²½μ° ν μ€νΈ λ°©ν₯(μΌμͺ½μμ μ€λ₯Έμͺ½ λλ μ€λ₯Έμͺ½μμ μΌμͺ½)μ λ§κ² μ‘°μ λλ μ리 νμμλ₯Ό μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
React Routerμ experimental_SuspenseList κ²°ν©
experimental_SuspenseListλ React Routerμ μλ²½νκ² μλνλ―λ‘ μ 체 κ²½λ‘μ ν΄λΉ μ»΄ν¬λνΈμ λ‘λ©μ κ΄λ¦¬ν μ μμ΅λλ€. κ²½λ‘ μ»΄ν¬λνΈλ₯Ό Suspense κ²½κ³λ‘ λνν λ€μ experimental_SuspenseListλ₯Ό μ¬μ©νμ¬ μ΄λ¬ν κ²½λ‘μ λ‘λ© μμλ₯Ό μ μ΄ν μ μμ΅λλ€.
import React, { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import { unstable_SuspenseList as SuspenseList } from 'react';
const Home = lazy(() => import('./Home'));
const About = lazy(() => import('./About'));
const Contact = lazy(() => import('./Contact'));
function App() {
return (
<Router>
<SuspenseList revealOrder="forwards">
<Suspense fallback={<p>ν νμ΄μ§ λ‘λ© μ€...</p>}>
<Route exact path="/" component={Home} />
</Suspense>
<Suspense fallback={<p>μ 보 νμ΄μ§ λ‘λ© μ€...</p>}>
<Route path="/about" component={About} />
</Suspense>
<Suspense fallback={<p>μ°λ½μ² νμ΄μ§ λ‘λ© μ€...</p>}>
<Route path="/contact" component={Contact} />
</Suspense>
</SuspenseList>
</Router>
);
}
μ΄ μμ μμλ μ¬μ©μκ° λ€λ₯Έ κ²½λ‘λ‘ μ΄λν λ ν΄λΉ νμ΄μ§κ° Suspense κ²½κ³ λ΄μμ λ‘λλ©λλ€. experimental_SuspenseListλ κ° κ²½λ‘μ λν λ‘λ© νμκΈ°κ° μμ°¨μ μΌλ‘ νμλλλ‘ ν©λλ€.
μ€λ₯ μ²λ¦¬ λ° ν΄λ°± μ λ΅
Suspenseλ λ‘λ© μν μ²λ¦¬λ₯Ό μν fallback propμ μ 곡νμ§λ§ μ€λ₯ μ²λ¦¬λ κ³ λ €νλ κ²μ΄ μ€μν©λλ€. μ»΄ν¬λνΈλ₯Ό λ‘λνμ§ λͺ»νλ©΄ Suspense κ²½κ³μμ μ€λ₯λ₯Ό ν¬μ°©νκ³ ν΄λ°±μ νμν©λλ€. κ·Έλ¬λ λ μμΈν μ€λ₯ λ©μμ§ λλ μ¬μ©μκ° μ»΄ν¬λνΈ λ‘λ©μ λ€μ μλν μ μλ λ°©λ²μ μ 곡ν μ μμ΅λλ€.
useErrorBoundary ν
(μΌλΆ μ€λ₯ κ²½κ³ λΌμ΄λΈλ¬λ¦¬μμ μ¬μ© κ°λ₯)μ μ¬μ©νμ¬ Suspense κ²½κ³ λ΄μμ μ€λ₯λ₯Ό ν¬μ°©νκ³ μ¬μ©μ μ§μ μ€λ₯ λ©μμ§λ₯Ό νμν μ μμ΅λλ€. λ€μ μλ λ©μ»€λμ¦μ ꡬννμ¬ μ¬μ©μκ° μ»΄ν¬λνΈ λ‘λ©μ λ€μ μλν μ μλλ‘ ν μλ μμ΅λλ€.
import React, { Suspense, lazy } from 'react';
import { useErrorBoundary } from 'react-error-boundary';
const MyComponent = lazy(() => import('./MyComponent'));
function MyComponentWrapper() {
const { showBoundary, reset } = useErrorBoundary();
if (showBoundary) {
return (
<div>
<p>MyComponentλ₯Ό λ‘λνλ λμ μ€λ₯κ° λ°μνμ΅λλ€.</p>
<button onClick={reset}>λ€μ μλ</button>
</div>
);
}
return <MyComponent />;
}
function App() {
return (
<Suspense fallback={<p>λ‘λ© μ€...</p>}>
<MyComponentWrapper />
</Suspense>
);
}
μ±λ₯ κ³ λ € μ¬ν λ° λͺ¨λ² μ¬λ‘
experimental_SuspenseListλ μ ν리μΌμ΄μ
μ μΈμ§λ μ±λ₯μ ν₯μμν¬ μ μμ§λ§ μ μ€νκ² μ¬μ©νκ³ μ±λ₯μ λ―ΈμΉλ μ μ¬μ μν₯μ κ³ λ €νλ κ²μ΄ μ€μν©λλ€.
- κ³Όλν μ€μ²© λ°©μ§:
experimental_SuspenseListμ»΄ν¬λνΈμ κ³Όλν μ€μ²©μ μ±λ₯ μ€λ²ν€λλ₯Ό μ λ°ν μ μμ΅λλ€. μ€μ²© μμ€μ μ΅μνμΌλ‘ μ μ§νκ³experimental_SuspenseListκ° μ¬μ©μ κ²½νμ μλΉν μ΄μ μ μ 곡νλ κ²½μ°μλ§ μ¬μ©νμΈμ. - μ»΄ν¬λνΈ λ‘λ© μ΅μ ν: μ½λ λΆν λ° μ§μ° λ‘λ©κ³Ό κ°μ κΈ°μ μ μ¬μ©νμ¬ μ»΄ν¬λνΈκ° ν¨μ¨μ μΌλ‘ λ‘λλλλ‘ ν©λλ€. μ΄λ κ² νλ©΄ λ‘λ© μνμμ μλΉλλ μκ°μ΄ μ΅μνλκ³
experimental_SuspenseListμ μ 체μ μΈ μν₯μ΄ μ€μ΄λλλ€. - μ μ ν ν΄λ°± μ¬μ©: κ°λ³κ³ μκ°μ μΌλ‘ λ§€λ ₯μ μΈ ν΄λ°±μ μ ννμΈμ. 볡μ‘ν μ»΄ν¬λνΈλ₯Ό ν΄λ°±μΌλ‘ μ¬μ©νλ κ²μ νΌνμΈμ. μ΄λ κ² νλ©΄
experimental_SuspenseListμ μ±λ₯ μ΄μ μ΄ λ¬΄ν¨νλ μ μμ΅λλ€. κ°λ¨ν μ€νΌλ, μ§νλ₯ νμμ€ λλ μ리 νμμ μ½ν μΈ λ₯Ό μ¬μ©νλ κ²μ΄ μ’μ΅λλ€. - μ±λ₯ λͺ¨λν°λ§: μ±λ₯ λͺ¨λν°λ§ λꡬλ₯Ό μ¬μ©νμ¬
experimental_SuspenseListκ° μ ν리μΌμ΄μ μ±λ₯μ λ―ΈμΉλ μν₯μ μΆμ ν©λλ€. μ΄λ κ² νλ©΄ μ μ¬μ μΈ λ³λͺ© νμμ μλ³νκ³ κ΅¬νμ μ΅μ ννλ λ° λμμ΄ λ©λλ€.
κ²°λ‘ : Suspense λ‘λ© ν¨ν΄ μμ©
experimental_SuspenseListλ React μ ν리μΌμ΄μ
μμ μ κ΅ν λ‘λ© ν¨ν΄μ λ§λλ λ° μ μ©ν λꡬμ
λλ€. κΈ°λ₯μ μ΄ν΄νκ³ μ μ€νκ² μ¬μ©νλ©΄ νΉν λ€νΈμν¬ μ‘°κ±΄μ΄ λ€μν μ§λ¦¬μ μμΉμ μ¬μ©μλ₯Ό μν΄ μ¬μ©μ κ²½νμ ν¬κ² ν₯μμν¬ μ μμ΅λλ€. μ»΄ν¬λνΈκ° νμλλ μμλ₯Ό μ λ΅μ μΌλ‘ μ μ΄νκ³ μ μ ν ν΄λ°±μ μ 곡ν¨μΌλ‘μ¨ μ μΈκ³ μ¬μ©μλ₯Ό μν λ μννκ³ λ§€λ ₯μ μ΄λ©° κΆκ·Ήμ μΌλ‘ λ λ§μ‘±μ€λ¬μ΄ μ¬μ©μ κ²½νμ λ§λ€ μ μμ΅λλ€.
experimental_SuspenseList λ° κΈ°ν μ€νμ κΈ°λ₯μ λν μ΅μ μ 보λ νμ 곡μ React μ€λͺ
μλ₯Ό μ°Έμ‘°νμΈμ. νλ‘λμ
νκ²½μμ μ€νμ κΈ°λ₯μ μ¬μ©νλ λ° λ°λ₯Έ μ μ¬μ μνκ³Ό μ ν μ¬νμ μ μνκ³ μ¬μ©μμκ² λ°°ν¬νκΈ° μ μ ꡬνμ μ² μ ν ν
μ€νΈνμμμ€.